/**
 * 认证工具类
 * 提供登录、获取用户信息等功能
 */
import { setCookie, getCookie, getToken, getOpenId } from './cookie.js';
import { callCloudFunction, checkTokenExpired } from './cloudRequest.js';

/**
 * 获取登录代码并处理登录流程
 * @returns {Promise<{openid: string, token: string}>} 登录信息
 */
export const getLoginCode = async () => {
  try {
    // 检查是否已有 token 和 openid
    const existingToken = getToken();
    const existingOpenid = getOpenId();
    
    if (existingToken && existingOpenid) {
      console.log('已从 cookie 中获取登录信息');
      return {
        openid: existingOpenid,
        token: existingToken
      };
    }
    
    const loginRes = await uni.login();
    // 登录接口不需要 token，这是获取 token 的入口
    const cloudRes = await callCloudFunction('loginWithWechat', { 
      js_code: loginRes.code 
    });

    // 保存 openid 和 token 到 cookie
    const openid = cloudRes.result.data.openid;
    const token = cloudRes.result.token || '';
    
    setCookie('openid', openid);
    if (token) {
      setCookie('token', token);
    }
    
    uni.setStorageSync('userId', openid);
    return {
      openid,
      token
    };
  } catch (error) {
    console.error('登录失败:', error);
    uni.showToast({ title: '登录失败，请重试', icon: 'none' });
    throw error;
  }
};

/**
 * 获取用户信息
 * @param {string} openid - 用户的openid
 * @returns {Promise<Object>} 用户信息
 */
export const getUserInfo = async (openid) => {
  try {
    // 如果没有提供 openid，尝试从 cookie 获取
    const userOpenid = openid || getOpenId();
    if (!userOpenid) {
      console.error('未找到用户 openid');
      throw new Error('未找到用户 openid');
    }
    
    const res = await callCloudFunction('getUser', { 
      user_id: userOpenid 
    });
    
    // 检查是否 token 过期
    if (checkTokenExpired(res.result)) {
      uni.showToast({ title: '登录已过期，请重新登录', icon: 'none' });
      // 重新登录
      await getLoginCode();
      // 重新获取用户信息
      return await getUserInfo(userOpenid);
    }
    
    if (res.result.data.data && res.result.data.data.length > 0) {
      return res.result.data.data[0];
    } else {
      console.log('未找到用户信息，可能是新用户');
      return null;
    }
  } catch (error) {
    console.error('获取用户信息失败:', error);
    uni.showToast({ title: '获取用户信息失败', icon: 'none' });
    throw error;
  }
};

/**
 * 检查登录状态，如果未登录或token过期则自动登录
 * @returns {Promise<boolean>} 是否已登录
 */
export const ensureLogin = async () => {
  try {
    // 检查是否已有 token 和 openid
    const existingToken = getToken();
    const existingOpenid = getOpenId();
    
    if (existingToken && existingOpenid) {
      // 验证token是否有效
      try {
        const res = await callCloudFunction('getUser', { 
          user_id: existingOpenid 
        });
        
        if (checkTokenExpired(res.result)) {
          // token过期，重新登录
          await getLoginCode();
        }
        
        return true;
      } catch (error) {
        console.error('验证token失败:', error);
        // 验证失败，重新登录
        await getLoginCode();
        return true;
      }
    } else {
      // 未登录，进行登录
      await getLoginCode();
      return true;
    }
  } catch (error) {
    console.error('确保登录失败:', error);
    return false;
  }
};
